嗨嗨!大家好!歡迎來到 Rust 三十天挑戰!!
作為一個平常主要寫 .NET 的後端工程師(或許你也是?),我對那些號稱「高效能」、「記憶體安全」的語言一直抱著既好奇又害怕的心情。好奇是因為總感覺那些底層技術很瞎趴很厲害,害怕則是因為雖然 C# 也有指標和 unsafe 程式碼,但我平常根本不碰,光想到要自己管記憶體就覺得頭很痛XD。
但最近在做一些高併發的 API 專案時,開始思考除了 .NET 之外是否有其他更適合的選擇。加上在朋友的介紹下認識了 Tauri 這個開源專案,一個用 Rust 打造的跨平台桌面應用框架,這更讓我對 Rust 產生了更濃厚的興趣。看到越來越多關於 Rust 的討論(特別是在 Web 後端和微服務領域),我想:既然都要學新東西了,不如就挑一個徹底不同的來挑戰自己吧!
這三十天的挑戰,除了想學會 Rust 本身,更重要的是我想記錄下這個「從Rust新手到能寫出一個簡單的Blog的程度」的過程。包括我踩到的坑、卡關的地方、以及那些突然開竅的瞬間。
如果你也和我一樣,對 Rust 完全陌生但很好奇,那就一起來吧!讓我們看看這個號稱「學會就回不去了」的語言,到底有什麼魅力!!!
1. 效能 (Performance)
簡單來說,Rust 讓你可以寫出像 C# 一樣方便的程式碼,但跑起來的速度卻像 C/C++ 一樣快!聽起來很神奇對吧?這就是所謂的「零成本抽象」—你用了高階的語言特性,但編譯器會幫你優化成最高效的機器碼。實測下來,Rust 程式的執行效能真的可以和 C/C++ 媲美,有時候甚至還更快。
2. 記憶體安全 (Memory Safety)
傳統的系統程式語言如 C/C++ 雖然效能卓越,但記憶體管理一直是開發者的痛點。緩衝區溢位、懸置指標、記憶體洩漏等問題時常困擾著開發者。Rust 透過其獨創的所有權系統(之後會補充),在編譯時期就能防止這些問題,讓你專注於業務邏輯而非記憶體管理。
3. 併發安全 (Concurrency Safety)
在多核心處理器當道的今天,併發程式設計變得越來越重要。Rust 的型別系統能在編譯時期就防止資料競爭,實現「無懼併發」,讓開發者能安心地撰寫多執行緒程式。
來看看 Rust 在各方面的表現:
vs. Python/JavaScript (高階語言)
vs. C/C++ (系統語言)
vs. Go (現代系統語言)
vs. C# (.NET) (企業級後端語言)
Rust 特別適合以下應用場景:
說了這麼多理論,也該是時候動手實作了!讓我們一步步開始建立 Rust 開發環境。
最推薦的方式是使用 rustup
,這是 Rust 官方的工具鏈管理器:
Windows:
下載並執行 rustup-init.exe
macOS/Linux:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安裝完成後,重新啟動終端機並執行:
rustc --version
cargo --version
如果能看到版本資訊,恭喜你!你的 Rust 已經成功安裝啦!
cargo
是 Rust 的建置工具和套件管理器,類似於 Node.js 的 npm 或 Python 的 pip。它能幫助我們:
讓我們來嘗試建立自己第一個 Rust 專案:
cargo new hello_rust
cd hello_rust
這會建立一個新的目錄結構:
hello_rust/
├── Cargo.toml
└── src/
└── main.rs
讓我們看看 src/main.rs
的內容:
fn main() {
println!("Hello, world!");
}
沒錯,就是這麼簡單!現在執行它:
cargo run
你應該會看到:
Compiling hello_rust v0.1.0 (/path/to/hello_rust)
Finished dev [unoptimized + debuginfo] target(s) in 0.50s
Running `target/debug/hello_rust`
Hello, world!
讓我們修改程式碼,加入一些互動元素:
use std::io;
fn main() {
println!("歡迎來到 Rust 的世界!");
println!("請輸入你的名字:");
let mut name = String::new();
io::stdin()
.read_line(&mut name)
.expect("讀取輸入失敗");
println!("你好,{}!歡迎開始 Rust 之旅!", name.trim());
}
再次執行 cargo run
,這次程式會要求你輸入名字,並給出個人化的歡迎訊息。
即使是這個簡單的程式,也包含了一些重要的 Rust 概念:
use std::io
:匯入標準函式庫中的輸入/輸出模組let mut name
:宣告一個可變的變數String::new()
:建立一個新的空字串expect()
:簡單的錯誤處理機制trim()
:移除字串前後的空白字元以上今天就先告一段落囉!明天我們將繼續深入探討 Rust 的變數、資料型別與常數。你會發現 Rust 的型別系統比你想像的更有趣!我們將學習變數的可變性(mutability)、Rust 的基本資料型別、變數遮蔽(shadowing)的概念,以及常數與變數的差異等內容。
不過在結束今天之前,有個小題目大家可以玩看看~
修改今天的程式,讓它能夠:
詢問使用者的年齡
根據年齡給出不同的歡迎訊息(例如:18歲以下、18-65歲、65歲以上)
溫馨小提示:你可能需要用到字串轉數字的功能,可以搜尋 parse() 方法!!!
也謝謝大家陪伴我踏出 Rust 學習的第一步。如果你在環境設定上遇到任何問題,歡迎在留言區討論。讓我們一起在這三十天的旅程中,從頭學習 Rust !!!
我們明天見!